﻿#region << 版 本 注 释 >>
/*----------------------------------------------------------------
// Copyright (C) 2021 kingerrobot
// 版权所有。 
//
// 文件名：BWcsLocSku
// 文件功能描述：
//
// 创建者：名字 (zzl)
// 时间：2021/12/9 15:13:54
//
// 修改人：
// 时间：
// 修改说明：
// 版本：V1.0.0
//----------------------------------------------------------------*/
#endregion
using KingerRobot.MexicoSailunMDC.Dao;

namespace KingerRobot.MexicoSailunMDC.SpiService;

internal class BWcsLocSku : IWcsLocSku
{

    private readonly static IProdProduct _ProdProduct = new BProdProduct();
    private readonly static IProdSkuProduct _ProdSkuProduct = new BProdSkuProduct();
    private readonly static IProdMaterial _ProdMaterial = new BProdMaterial();
    private readonly static IWcsEquipLocHold _WcsEquipLocHold = new BWcsEquipLocHold();
    public POWcsLocSku GetWcsLocSkuByLocId(long? locId)
    {
        var db = Db.Default;
        var result = db.WcsLocSkus.Where(t => t.LocId == locId).OrderByDescending(t => t.CreateTime).FirstOrDefault();
        return result;
    }
    public List<POWcsLocSku> GetWcsLocSkuByLocIds(List<long?> locIds)
    {
        var db = Db.Default;
        var result = db.WcsLocSkus.Where(t => locIds.Contains(t.LocId)).ToList();
        return result;
    }
    public POWcsLocSku GetWcsLocSkuNoTaskByLocId(long? locId)
    {
        //var db = Db.Default;
        //var result = db.WcsLocSkus
        //    .Where(t => t.LocId == locId && t.TaskId == null)
        //    .OrderByDescending(t => t.CreateTime).FirstOrDefault();
        //return result;

        var db = Db.Default;
        var result = db.WcsLocSkus
            .Where(t => t.LocId == locId)
            .OrderByDescending(t => t.CreateTime).FirstOrDefault();
        return result;
    }
    public List<POWcsLocSku> GetWcsLocSkus()
    {
        var db = Db.Default;
        var result = db.WcsLocSkus.ToList();
        return result;
    }

    public int AddWcsLocSku(long? locId, long? skuId)
    {
        if (locId == 0 || skuId == 0)
        {
            return 0;
        }
        var db = Db.Default;
        var result = db.WcsLocSkus.Insert(new POWcsLocSku
        {
            Id = XID.Nextval,
            LocId = locId,
            SkuId = skuId,
            SkuIndex = 1,
        });
        return result;
    }

    public int DeleteWcsLocSkuBySku(long? skuId)
    {
        if (skuId == 0)
        {
            return 0;
        }
        var db = Db.Default;
        //OLDTODO 这个删除要改
        var result = db.WcsLocSkus.Where(t => t.SkuId == skuId).Delete();
        return result;
    }
    public int DeleteWcsLocSkuByLoc(long? locId)
    {
        if (locId == 0)
        {
            return 0;
        }
        var db = Db.Default;
        var result = db.WcsLocSkus.Where(t => t.LocId == locId).Delete();
        return result;
    }
    public int DeleteWcsLocSkuBySkuLoc(long? skuId, long? locId)
    {
        if (locId == 0 || skuId == 0)
        {
            return 0;
        }
        var db = Db.Default;
        var result = db.WcsLocSkus.Where(t => t.LocId == locId && t.SkuId == skuId).Delete();
        return result;
    }


    public int SetWcsLocSku(long? locId, long? skuId, bool isDelLoc = false)
    {
        if (isDelLoc)
        {
            DeleteWcsLocSkuByLoc(locId);
        }
        var update = DeleteWcsLocSkuBySku(skuId);
        var add = AddWcsLocSku(locId, skuId);
        return update & add;
    }

    public int UpdateWcsLocSkuTask(long skuId, long taskId)
    {
        var db = Db.Default;
        var result = db.WcsLocSkus.Where(t => t.SkuId == skuId).Update( new POWcsLocSku
        {
            TaskId = taskId,
        });
        return db.SaveChanges();
    }

    public POWcsLocSku GetWcsLocSkuNoTaskBySkuId(long? skuId, long locId)
    {
        var db = Db.Default;
        var result = db.WcsLocSkus.Where(t => t.SkuId == skuId && t.LocId == locId && t.TaskId == null).OrderByDescending(t => t.CreateTime).FirstOrDefault();
        return result;
    }

    public List<POWcsLocSku> GetWcsLocSkusByLocIds(List<long> locIds)
    {
        var db = Db.Default;
        var result = db.WcsLocSkus.Where(t => locIds.Contains(t.LocId ?? 0)).ToList();
        return result;
    }

    public (List<WcsLocSkuBean>, List<POProdSkuProduct>, List<POWcsLocSku>, List<POWcsEquipLocHold>, List<POProdProduct>) GetWcsLocSkuBeansByCodes(List<string> codes)
    {
        var db = Db.Default;

        var products = _ProdProduct.GetProductByCodes(codes);
        if (products.Count == 0)
        {
            return (new(), new(), new(), new(), new());
        }

        var wcsLocSkus = GetWcsLocSkus();

        var wcsEquipLocHolds = _WcsEquipLocHold.GetEquipLocHolds();

        var prodSkuProducts = _ProdSkuProduct.GetProdSkuProducts();

        var prodMaterials = _ProdMaterial.GetMaterials();

        var result = wcsLocSkus.Join(wcsEquipLocHolds, f => f.LocId, s => s.LocId, (f, s) => new
        {
            WcsLocSku = f,
        }).Join(prodSkuProducts, f => f.WcsLocSku.SkuId, s => s.SkuId, (f, s) => new
        {
            f.WcsLocSku,
            SkuProduct = s,
        }).Join(products, f => f.SkuProduct.ProductId, s => s.Id, (f, s) => new
        {
            f.WcsLocSku,
            ProdProduct = s,
            f.SkuProduct,
        }).Join(prodMaterials, f => f.SkuProduct.MaterialId, s => s.Id, (f, s) => new WcsLocSkuBean
        {
            WcsLocSku = f.WcsLocSku,
            ProdProduct = f.ProdProduct,
            SkuProduct = f.SkuProduct,
            ProdMaterial = s,
        }).ToList();
        return (result, prodSkuProducts, wcsLocSkus, wcsEquipLocHolds, products);
    }
    public POWcsLocSku GetWcsLocSkuBySkuId(long? skuId)
    {
        var db = Db.Default;
        var result = db.WcsLocSkus.Where(t => t.SkuId == skuId).OrderByDescending(t => t.CreateTime).FirstOrDefault();
        return result;
    }
    public List<POWcsLocSku> GetWcsLocSkusBySkuId(long? skuId)
    {
        var db = Db.Default;
        var result = db.WcsLocSkus.Where(t => t.SkuId == skuId).OrderByDescending(t => t.CreateTime).ToList();
        return result;
    }
}
